4809
24466
Cette question a déjà des réponses ici:
Pas de conversion implicite dans l'opérateur surchargé
(2 réponses)
Fermé il y a 7 ans.
J'écris un simple wrapper pour un type élémentaire, et j'essaye d'éviter d'avoir à écrire trop de saveurs d'opérateurs standard. J'espérais que la conversion de type implicite aiderait, mais ce n'est pas le cas. Voici un exemple simplifié:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Opérateur Int + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(vide) (Int (1) + 2); // Bien
(vide) (2 + Int (1)); // erreur: opérandes non valides dans l'expression binaire ('int' et 'Int')
}
J'utilise llvm. La première ligne de main compile très bien. Le second provoque une erreur. Maintenant, ce que j'espérais qu'il se passerait dans la deuxième ligne, c'est que 2 serait implicitement converti en Int (2), suivi d'un appel à operator +. Pourquoi cela n'arrive-t-il pas? Pourquoi la conversion implicite se produit-elle dans la première ligne? 
Cela se produit dans la première ligne car le seul opérateur + disponible est operator + (Int &) (qui a un premier paramètre implicite de Int pour cette instance). La deuxième ligne échoue car le premier paramètre est un int et il n'a aucune idée qu'il doit le convertir avant de tenter l'opération (il ne sait pas qu'il doit utiliser Int :: operator +).
Vous pouvez éviter ce problème en faisant de l'opérateur une fonction d'ami non membre (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
opérateur int ami + (const Int & lhs, const Int & rhs);
};
Opérateur Int + (const Int & lhs, const Int & rhs)
{
retourne lhs._i + rhs._i;
}
int main()
{
Int i;
i + 5;
5 + i;
return 0;
}
|
Ce n'est pas la réponse que vous recherchez? Parcourez les autres questions étiquetées conversion implicite de mot-clé opérateur c ++ ou posez votre propre question.